10 REM --------------------------------- 11 REM AMAZEMENT 12 REM RUPERT REPORT #47 13 REM 14 REM C-128 / C-64 15 REM C-64 USERS SEE NOTES AT LINE 2000 16 REM 17 REM --------------------------------- 20 REM ================ INITIALIZATION = 30 PRINT"[147]" 40 FALSE=0 : TRUE=NOT FALSE 50 NC=100 :REM # CELLS 60 SQ=INT(SQR(NC)+.5) :REM WIDTH OF SQUARE 70 DIM MV(NC,1),MS(NC,4) :REM MOVES AND MAZE STRUCTURE 80 DIM X(NC),Y(NC) :REM SCREEN POSITIONS 90 GOSUB 1320 :REM GET MAZE STRUCTURE 100 GOSUB 1500 :REM GET SCREEN POSITIONS 110 GOSUB 1700 :REM DRAW SCREEN 120 DLY=100 :REM MOVE DELAY 130 FOR N=1 TO NC : IF MS(N,0)=3 THEN C=N : N=NC 140 NEXT N :REM FIND STARTING CELL 150 IF C=0 THEN PRINT"NO STARTING CELL" : END 160 REM ==================== MAIN LOOP = 170 GOSUB 300 :REM PICK MOVE 180 GOSUB 400 :REM CHECK MOVE 190 GOSUB 900 :REM UPDATE SCREEN 200 IF NOT XIT AND NOT NOSOLN THEN 170 210 A=0:B=21:CH$="":GOSUB 2200 220 IF NOSOLN THEN PRINT"NO SOLUTION" : END 230 GOSUB 3010 :REM RETRACE SOLUTION 240 A=0:B=21:CH$="":GOSUB 2200 250 END 260 REM ================================ 300 REM -------------------- PICK MOVE - 310 GDMOVE=TRUE :REM ASSUME GOOD 320 MV(C,0)=MV(C,0)+1 :REM INCREMENT MOVE DIRECTION; C=CURRENT CELL 330 DIR=MV(C,0) :REM CURRENT DIRECTION 340 RETURN 350 REM 400 REM ------------------- CHECK MOVE - 410 BKUP=FALSE :REM ASSUME NO BACKUP 420 IF DIR>4 THEN GOSUB 800 : GOTO 490 : REM MUST BACK UP 430 NXTCELL=MS(C,DIR) :REM NEXT CELL # 440 CS=MS(NXTCELL,0) :REM CELL STATUS 450 REM CS=0,2,3 INVALID MOVE 460 REM CS=1 VALID MOVE 470 REM CS=4 END OF MAZE 480 ON CS+1 GOSUB 600,500,600,600,700 490 RETURN :REM TO MAIN LOOP 500 REM ------------------- VALID MOVE - 510 MV(C,0)=DIR :REM SET FWD LINK 520 MV(NXTCELL,1)=C :REM SET BACK LINK 530 MS(NXTCELL,0)=2 :REM STATUS=USED 540 C=NXTCELL :REM CURRENT CELL 550 RETURN 600 REM ----------------- INVALID MOVE - 610 GDMOVE=FALSE 620 IF MS(C,0)=3 AND MV(C,0)=4 THEN NOSOLN=TRUE 630 RETURN 700 REM ------------------------- DONE - 710 MV(C,0)=DIR :REM SET FWD LINK 720 MV(NXTCELL,1)=C :REM SET BACK LINK 730 C=NXTCELL 740 XIT=TRUE 750 RETURN 800 REM ----------------------- BACKUP - 810 RESTART=FALSE :REM ASSUME NO RESTART 820 NXTCELL=MV(C,1) :REM USE BACK LINK 830 MV(C,0)=0 :REM RESTORE FWD LINK 840 MS(C,0)=1 :REM SET STATUS TO AVAILABLE 850 C0=C :REM SAVE OLD CELL # 860 C=NXTCELL 870 BKUP=TRUE 880 IF MS(C,0)=3 THEN RESTART=TRUE : IF MV(C,0)=4 THEN NOSOLN=TRUE 890 RETURN 900 REM ---------------- SCREEN UPDATE - 910 C$="O" 920 IF NOT GDMOVE THEN GOTO 1060 930 IF XIT THEN C$="E" : GOTO 1000 940 IF NOT BKUP THEN GOTO 1000 950 IF NOSOLN OR RESTART THEN C$="S" 960 REM RESTORE CELL C0 TO UNUSED 970 A=X(C0):B=Y(C0):CH$=" ":GOSUB 2200 980 A=X(C0):B=Y(C0):CH$="*":GOSUB 2200 990 REM MOVE CURSOR TO CELL C 1000 FOR N=1 TO 2 1010 A=X(C):B=Y(C):CH$=" ": GOSUB 2200 1020 FOR P=1 TO DLY : NEXT 1030 A=X(C):B=Y(C):CH$=C$ : GOSUB 2200 1040 FOR P=1 TO DLY : NEXT 1050 NEXT N 1060 RETURN :REM TO MAIN 1070 REM =============================== 1100 REM MAZE DATA STRUCTURE 1110 REM 1120 REM MS(C,N): C=CELL #, N=0-4 1130 REM N=0: CURRENT CELL STATUS 1140 REM 0=NO ACCESS,1=AVAILABLE,2=USED 1150 REM 3=START, 4=END 1160 REM N=1-4: CELL #'S IN DIRECTIONS 1170 REM 1-4 FROM CELL C; 1180 REM 1=UP, 2=RT, 3=DOWN, 4=LEFT 1190 REM ------------------------------- 1200 REM MS(C,0) CELL STATUS DATA 1210 DATA 1,0,0,0,1,1,1,1,1,1 1220 DATA 1,1,1,1,0,0,1,0,1,0 1230 DATA 1,0,0,1,1,0,1,0,1,0 1240 DATA 1,0,0,0,1,0,1,0,1,0 1250 DATA 0,1,1,1,1,0,1,0,1,0 1260 DATA 1,1,0,0,1,0,1,0,1,0 1270 DATA 1,0,0,0,0,0,1,0,1,1 1280 DATA 1,0,0,0,0,0,1,0,0,1 1290 DATA 3,1,1,1,1,1,1,0,1,1 1300 DATA 1,0,0,0,0,4,0,1,1,0 1310 REM READ CELL STATUS DATA 1320 FOR N=1 TO NC : READ MS(N,0) : NEXT 1330 REM CALC ADJACENT CELL #'S 1340 FOR N=1 TO NC : MOD%=N-SQ*INT(N/SQ+.01) 1350 MS(N,1)=N-SQ : IF NNC-SQ THEN MS(N,3)=0 1380 MS(N,4)=N-1 : IF MOD%=1 THEN MS(N,4)=0 1390 NEXT N 1400 RETURN 1500 REM --- GET CELL SCREEN LOCATIONS - 1510 ROW=1 1520 COL=1 1530 FOR C=1 TO NC STEP SQ 1540 FOR N=C TO C+SQ-1 1550 Y(N)=ROW 1560 X(N)=COL : COL=COL+3 1570 NEXT N 1580 ROW=ROW+2 : COL=1 1590 NEXT C 1600 RETURN 1700 REM ----------------- DRAW SCREEN - 1710 PRINT CHR$(147) 1720 FOR N=1 TO NC 1730 C$="." : IF MS(N,0)=1 THEN C$="*" 1740 IF MS(N,0)=3 THEN C$="S" 1750 IF MS(N,0)=4 THEN C$="E" 1760 A=X(N):B=Y(N):CH$=C$ : GOSUB 2200 1770 NEXT 1780 RETURN 2000 REM ============================= 2010 REM >>> NOTES FOR C-64 USERS: 2020 REM CHANGE THE 'CHAR' 2030 REM STATEMENTS IN LINES 210, 240, 2040 REM 970, 980, 1010, 1030, & 1760 2100 REM TO THE FOLLOWING: 2110 REM 210 A=0:B=21:CH$="":GOSUB 2200 2120 REM 240 A=0:B=21:CH$="":GOSUB 2200 2130 REM 970 A=X(C0):B=Y(C0):CH$=" ":GOSUB 2200 2140 REM 980 A=X(C0):B=Y(C0):CH$="*":GOSUB 2200 2150 REM 1010 A=X(C):B=Y(C):CH$=" ": GOSUB 2200 2160 REM 1030 A=X(C):B=Y(C):CH$=C$ : GOSUB 2200 2170 REM 1760 A=X(N):B=Y(N):CH$=C$ : GOSUB 2200 2180 REM ============================= 2190 REM C-64 ONLY >>>>>>>> 2200 POKE 214,B-1 : PRINT 2210 POKE 211,A : PRINT CH$ : RETURN 2220 REM ============================= 3000 REM --- RETRACE THE SOLUTION ---- 3010 C$="-" 3020 C=MV(C,1) :IF MS(C,0)<>3 THEN GOSUB 1000 : GOTO 3020 3030 C$="+" 3040 C=MS(C,MV(C,0)) :IF MS(C,0)<>4 THEN GOSUB 1000 : GOTO 3040 3050 RETURN